www.gusucode.com > WSTMall PHP网店系统 v1.6.0PHP源码程序 > WSTMall PHP网店系统 v1.6.0/wstmall_v1.6.0_160506/wstmall_v1.6.0_160506/Apps/Home/Model/PaymentsModel.class.php

    <?php
 namespace Home\Model;
/**
 * ============================================================================
 * WSTMall开源商城
 * 官网地址:http://www.wstmall.com 
 * 联系QQ:707563272
 * ============================================================================
 * 支付类
 */
use Think\Model;
class PaymentsModel extends BaseModel {
	/**
	* 获取支付列表
	*/
	public function getList(){
	     $m = M('payments');
		 $payments = $m->where('enabled=1')->order('payOrder asc')->select();
		 $paylist = array();
		 foreach ($payments as $key => $payment) {
			 $payConfig = json_decode($payment["payConfig"]) ;
			 foreach ($payConfig as $key2 => $value) {
			 	$payment[$key2] = $value;
			 }
			 //$payments[$key] = $payment;
			 if($payment["isOnline"]){
			 	$paylist["onlines"][] = $payment;
			 }else{
			 	$paylist["unlines"][] = $payment;
			 }
		 }
		 return $paylist;
	}
	
	/**
	 * 获取支付信息
	 * @return unknown
	 */
	public function getPayment($payCode=""){
		$m = M('payments');
		$payCode = $payCode?$payCode:WSTAddslashes(I("payCode"));
		$payment = $m->where("enabled=1 AND payCode='$payCode' AND isOnline=1")->find();
		$payConfig = json_decode($payment["payConfig"]) ;
		foreach ($payConfig as $key => $value) {
			$payment[$key] = $value;
		}
		return $payment;
	}
	  
	/**
	* 生成支付代码
	* @param   array   $order      订单信息
	* @param   array   $payment    支付方式信息
	*/
    function getAlipayUrl(){
    	$payment = self::getPayment();
        $real_method = 2;
        
        switch ($real_method){
            case '0':
                $service = 'trade_create_by_buyer';
                break;
            case '1':
                $service = 'create_partner_trade_by_buyer';
                break;
            case '2':
                $service = 'create_direct_pay_by_user';
                break;
        }
		
        $extend_param = '';
        $orderunique = WSTAddslashes(I("orderunique"));
        
        $USER = session('WST_USER');
        $userId = (int)$USER['userId'];
        $obj["userId"] = $userId;
        $orderId = (int)I("orderId");
        
        if($orderId>0){
        	$obj["orderType"] = 1;
        	$obj["uniqueId"] = $orderId;
        }else{
        	$obj["orderType"] = 2;
        	$obj["uniqueId"] = session("WST_ORDER_UNIQUE");
        }
        $order = self::getPayOrders($obj);
        $orderAmount = $order["needPay"];
       
        $return_url = WSTDomain().'/Wstapi/payment/return_alipay.php';
        $notify_url = WSTDomain().'/Wstapi/payment/notify_alipay.php';
        $parameter = array(
        	'extra_common_param'=> $userId."@".$obj["orderType"],
            'service'           => $service,
            'partner'           => $payment['parterID'],
            '_input_charset'    => "utf-8",
            'notify_url'        => $notify_url,
            'return_url'        => $return_url,
            /* 业务参数 */
            'subject'           => '支付购买商品费'.$orderAmount.'元',
        	'body'  	        => '支付订单费用',
            'out_trade_no'      => $obj["uniqueId"],
        	'total_fee'         => $orderAmount,
            'quantity'          => 1,
            'payment_type'      => 1,
            /* 物流参数 */
            'logistics_type'    => 'EXPRESS',
            'logistics_fee'     => 0,
            'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
            /* 买卖双方信息 */
            'seller_email'      => $payment['payAccount']
        );
        ksort($parameter);
        reset($parameter);
        $param = '';
        $sign  = '';
        foreach ($parameter AS $key => $val){
            $param .= "$key=" .urlencode($val). "&";
            $sign  .= "$key=$val&";
        }
        $param = substr($param, 0, -1);
        $sign  = substr($sign, 0, -1). $payment['parterKey'];
        return 'https://mapi.alipay.com/gateway.do?'.$param. '&sign='.md5($sign).'&sign_type=MD5';
    }


    /**
     * 获取支付订单信息
     */
    public function getPayOrders ($obj){
    	$userId = (int)$obj["userId"];
    	$orderType = (int)$obj["orderType"];
    	if($orderType==1){
    		$orderId = (int)$obj["uniqueId"];
    		$sql = "SELECT SUM(needPay) needPay FROM __PREFIX__orders WHERE userId = $userId AND orderId = $orderId AND orderFlag = 1 AND needPay>0 AND orderStatus = -2 AND isPay = 0 AND payType = 1";
    	}else{
    		$orderunique = WSTAddslashes($obj["uniqueId"]);
    		$sql = "SELECT SUM(needPay) needPay FROM __PREFIX__orders WHERE userId = $userId AND orderunique = '$orderunique' AND orderFlag = 1 AND needPay>0 AND orderStatus = -2 AND isPay = 0 AND payType = 1";
    	}
    	$data = self::queryRow($sql);
    	return $data;
    }

    /**
     * 完成支付订单
     */
    public function complatePay ($obj){

    	$trade_no = WSTAddslashes($obj["trade_no"]);
    	$orderType = (int)$obj["order_type"];
    	if($orderType==1){
    		$orderId = (int)$obj["out_trade_no"];
    	}else{
    		$orderunique = WSTAddslashes($obj["out_trade_no"]);
    	}
		$userId = (int)$obj["userId"];
		$payFrom = (int)$obj["payFrom"];
		if($orderType==1){
			$sql = "select og.orderId,og.goodsId,og.goodsNums,og.goodsAttrId from __PREFIX__order_goods og, __PREFIX__orders o where o.userId=$userId and og.orderId = o.orderId AND o.orderId = $orderId and o.payType = 1 and o.needPay > 0 and o.orderFlag=1 and o.orderStatus=-2";
		}else{
			$sql = "select og.orderId,og.goodsId,og.goodsNums,og.goodsAttrId from __PREFIX__order_goods og, __PREFIX__orders o where o.userId=$userId and og.orderId = o.orderId AND o.orderunique = '$orderunique' and o.payType = 1 and o.needPay > 0 and o.orderFlag=1 and o.orderStatus=-2";
		}
		$goodslist = $this->query($sql);
		$data = array();
		$data["needPay"] = 0;
		$data["isPay"] = 1;
		$data["orderStatus"] = 0;
		$data["tradeNo"] = $trade_no;
		$data["payFrom"] = $payFrom;
		$rd = array('status'=>-1);
		$om = M('orders');
		if($orderType==1){
			$rs = $om->where("orderId = $orderId and payType = 1 and needPay > 0 and orderFlag=1 and orderStatus=-2")->save($data);
		}else{
			$rs = $om->where("orderunique = '$orderunique' and payType = 1 and needPay > 0 and orderFlag=1 and orderStatus=-2")->save($data);
		}
		if(false !== $rs){
			$rd['status']= 1;
			//修改库存
			foreach ($goodslist as $key=> $sgoods){
				$goodsId = $sgoods['goodsId'];
				$goodsNums = $sgoods['goodsNums'];
				$goodsAttrId = $sgoods['goodsAttrId'];
				$sql="update __PREFIX__goods set goodsStock=goodsStock-".$goodsNums." where goodsId=".$goodsId;
				$this->execute($sql);
				if((int)$goodsAttrId>0){
					$sql="update __PREFIX__goods_attributes set attrStock=attrStock-".$goodsNums." where id=".$goodsAttrId;
					$this->execute($sql);
				}
			}
			if($orderType==1){
				$sql = "select orderId,orderNo from __PREFIX__orders where userId=$userId and orderId=$orderId";
			}else{
				$sql = "select orderId,orderNo from __PREFIX__orders where userId=$userId and orderunique='$orderunique'";
			}

			$list = $this->query($sql);
			for($i=0;$i<count($list);$i++) {
				$orderId = $list[$i]["orderId"];
				$data = array();
				$lm = M('log_orders');
				$data["orderId"] = $orderId;
				$data["logContent"] = "订单已支付,下单成功";
				$data["logUserId"] = $userId;
				$data["logType"] = 0;
				$data["logTime"] = date('Y-m-d H:i:s');
				$ra = $lm->add($data);
			}
		}
    	
		return $rd;
    }
    

    /**
     * 支付回调接口
     * @param unknown $request
     * @return multitype:string boolean
     */
    function notify($request){
    	$return_res = array(
    		'info'=>'',
    		'status'=>false,
    	);
    	$request = $this->argSort($request);
    	/* 检查数字签名是否正确 */
    	$isSign = $this->getSignVeryfy($request);
    	if (!$isSign){//签名验证失败
    		$return_res['info'] = '签名验证失败';
    		return $return_res;
    	}
    	if ($request['trade_status'] == 'TRADE_SUCCESS' || $request['trade_status'] == 'TRADE_FINISHED' || $request['trade_status'] == 'WAIT_SELLER_SEND_GOODS' || $request['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS'){
    		$return_res['status'] = true;
    	}
    	return $return_res;
    }
    
    /**
     * 获取返回时的签名验证结果
     * @param unknown $para_temp
     * @return boolean
     */
    function getSignVeryfy($para_temp) {
    	$payment = self::getPayment("alipay");
    	$parterKey = $payment["parterKey"];
    	//除去待签名参数数组中的空值和签名参数
    	$para_filter = $this->paraFilter($para_temp);
    	//对待签名参数数组排序
    	$para_sort = $this->argSort($para_filter);
    	//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
    	$prestr = $this->createLinkstring($para_sort);
    
    	$isSgin = false;
    	$isSgin = $this->md5Verify($prestr, $para_temp['sign'], $parterKey);
    	return $isSgin;
    }
    
    /**
     * 验证签名
     * @param unknown $prestr
     * @param unknown $sign
     * @param unknown $key
     * @return boolean
     */
    function md5Verify($prestr, $sign, $key) {
    	$prestr = $prestr . $key;
    	$mysgin = md5($prestr);
    	if($mysgin == $sign) {
    		return true;
    	}else {
    		return false;
    	}
    }
    
    /**
     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
     */
    function createLinkstring($para) {
    	$arg  = "";
    	while (list ($key, $val) = each ($para)) {
    		$arg.=$key."=".$val."&";
    	}
    	//去掉最后一个&字符
    	$arg = substr($arg,0,count($arg)-2);
    	//如果存在转义字符,那么去掉转义
    	if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
    
    	return $arg;
    }
    
    /**
     * 除去数组中的空值和签名参数
     */
    function paraFilter($para) {
    	$para_filter = array();
    	while (list ($key, $val) = each ($para)) {
    		if($key == "sign" || $key == "sign_type" || $val == "")continue;
    		else    $para_filter[$key] = $para[$key];
    	}
    	return $para_filter;
    }
    
    /**
     * 对数组排序
     * @param unknown $para
     * @return unknown
     */
    function argSort($para) {
    	ksort($para);
    	reset($para);
    	return $para;
    }
};
?>